package com.wonders;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

import static java.lang.Thread.sleep;

/**
 * Servlet是单例多线程的，servlet容器在初始化Servlet时会为每一个Servlet创建一个
 * 线程池，当请求到来时，servlet会从线程池中获取一个线程去执行，然后等待着这个线程的执行结果，
 * 最终将结果返回给客户端
 */
@WebServlet("/NoAsyncServlet1")
public class NoAsyncServlet1 extends HttpServlet {
    /**
     * 这段代码访问的结果是：客户端的浏览器不停的转圈圈，直到8秒后，才返回结果。对于客户端
     * 来说体验较差，能不能先告诉我一个结果，然后你们在后台继续执行耗时逻辑，等你们的耗时逻辑执行完了
     * 在来通知我？看AsyncServlet2
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.append("主线程开始运行<br/>");
        // 我要执行一个很耗时的操作
        try {
            for (int i = 0; i < 8; i++) {
                System.out.println("i == " + i);
                sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        out.append("主线程运行结束<br/>");
    }
}
